package sv.gob.mh.dgii.model;

import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;

@Entity
@Table(name = "ED_NOTA_ABONO", schema = "EDADEPUDOC", uniqueConstraints = {})
public class EdNotaAbono implements java.io.Serializable {

	private static final long serialVersionUID = 5105056221098585686L;

	@Id
	@Column(name = "N_NOTA_ABONO", unique = true, nullable = false, insertable = true, updatable = true, length = 12)
	@NotNull
	private String nnotaAbono;

	@ManyToOne(cascade = {}, fetch = FetchType.LAZY)
	@JoinColumn(name = "C_MONEDA", unique = false, nullable = false, insertable = true, updatable = true)
	@NotNull
	@Valid
	private TbMoneda tbMoneda;

	@ManyToOne(cascade = {}, fetch = FetchType.LAZY)
	@JoinColumn(name = "C_UNIDAD_RECEP", unique = false, nullable = true, insertable = true, updatable = true)
	@Valid
	private TbUnidadRecep tbUnidadRecep;

	@ManyToOne(cascade = {}, fetch = FetchType.LAZY)
	@JoinColumn(name = "N_PLANILLA", unique = false, nullable = false, insertable = true, updatable = true)
	@NotNull
	@Valid
	private EdPlanilla edPlanilla;

	@Column(name = "C_USUARIO", unique = false, nullable = false, insertable = true, updatable = true, length = 30)
	@NotNull
	private String cusuario;

	@Column(name = "V_TOTAL_ABONADO", unique = false, nullable = true, insertable = true, updatable = true, precision = 12)
	private Double vtotalAbonado;

	@Temporal(TemporalType.DATE)
	@Column(name = "F_RECEP_CUMPLIM", unique = false, nullable = true, insertable = true, updatable = true, length = 7)
	private Date frecepCumplim;

	@Column(name = "N_DGI_DOC_NOTA", unique = false, nullable = true, insertable = true, updatable = true, precision = 5, scale = 0)
	private Integer ndgiDocNota;

	@Column(name = "V_DGI_MON_NOTA", unique = false, nullable = true, insertable = true, updatable = true, precision = 12)
	private Double vdgiMonNota;

	@Column(name = "N_DGI_DOC_DIGIT", unique = false, nullable = true, insertable = true, updatable = true, precision = 5, scale = 0)
	private Integer ndgiDocDigit;

	@Column(name = "V_DGI_MON_DIG", unique = false, nullable = true, insertable = true, updatable = true, precision = 12)
	private Double vdgiMonDig;

	@Temporal(TemporalType.DATE)
	@Column(name = "FH_ACTUALIZACION", unique = false, nullable = true, insertable = true, updatable = true, length = 7)
	private Date fhactualizacion;

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "FH_INGRESO", unique = false, nullable = false, insertable = true, updatable = true, length = 7)
	@NotNull
	private Date fhingreso;

	@Column(name = "I_LOTE", unique = false, precision = 10, scale = 0)
	private Long ilote;

	@Column(name = "B_ENVIADO", unique = false, precision = 1, scale = 0)
	private Integer benviado;

	@Column(name = "B_CUADRE_NOTA", unique = false, precision = 1, scale = 0)
	private Integer bcuadreNota;

	@Column(name = "B_STATUS_NOTA", unique = false, nullable = false, insertable = true, updatable = true, precision = 1, scale = 0)
	@NotNull
	private Integer bstatusNota;

	@Temporal(TemporalType.DATE)
	@Column(name = "FH_CIERRE_LOTE", unique = false, nullable = true, insertable = true, updatable = true, length = 7)
	private Date fhcierreLote;

	@Column(name = "C_USUARIO_CIERRE", unique = false, nullable = true, insertable = true, updatable = true, length = 40)
	private String cusuarioCierre;

	@Column(name = "C_USUARIO_SUPERV", unique = false, nullable = true, insertable = true, updatable = true, length = 40)
	private String cusuarioSuperv;

	@Temporal(TemporalType.DATE)
	@Column(name = "FH_SUPERVISION", unique = false, nullable = true, insertable = true, updatable = true, length = 7)
	private Date fhsupervision;

	@Column(name = "S_NOTA_SUPERV", unique = false, nullable = true, insertable = true, updatable = true)
	private String snotaSuperv;

	@Column(name = "B_RECIBIDO", unique = false, precision = 1, scale = 0)
	private Integer brecibido;

	@Column(name = "C_USUARIO_RECIBE", unique = false, nullable = true, insertable = true, updatable = true, length = 40)
	private String cusuarioRecibe;

	@Temporal(TemporalType.DATE)
	@Column(name = "FH_RECIBE_CTRL_DOC", unique = false, nullable = true, insertable = true, updatable = true, length = 7)
	private Date fhrecibeCtrlDoc;

	@Column(name = "M_FORMATO", unique = false, nullable = true, insertable = true, updatable = true, length = 1)
	private String mformato;

	@Column(name = "C_USUARIO_ENVIA", unique = false, nullable = true, insertable = true, updatable = true, length = 40)
	private String cusuarioEnvia;

	@Temporal(TemporalType.DATE)
	@Column(name = "FH_ENVIO_CTRL_DOC", unique = false, nullable = true, insertable = true, updatable = true, length = 7)
	private Date fhenvioCtrlDoc;

	@Column(name = "S_HOST_FOLDER", unique = false, nullable = true, insertable = true, updatable = true, length = 50)
	private String shostFolder;

	@Column(name = "N_DOC_PLA_DGII", unique = false, nullable = true, insertable = true, updatable = true, precision = 22, scale = 0)
	private Double ndocPlaDgii;

	@Column(name = "V_MON_PLA_DGII", unique = false, nullable = true, insertable = true, updatable = true, precision = 12)
	private Double vmonPlaDgii;

	@Column(name = "S_OBSERVACION", unique = false, nullable = true, insertable = true, updatable = true)
	private String sobservacion;
	
	@Column(name = "I_TECNICO", length = 10)
	private Long itecnico;

	@OneToMany( fetch = FetchType.LAZY, mappedBy = "edNotaAbono")
	private Set<EdDetalleNota> edDetalleNotas = new HashSet<EdDetalleNota>(0);

	@OneToMany( fetch = FetchType.LAZY, mappedBy = "edNotaAbono")
	private Set<EdDeclaraciones> edDeclaracioneses = new HashSet<EdDeclaraciones>(
			0);

	@Transient
	private Boolean cierreDigitacion = new Boolean(false);
	
	@Transient
	private boolean checked = false;
	
	@Transient
	private Boolean cierreCalidad = new Boolean(false);
	
	@Transient
	private Integer foliosEnCalidad = 0;
	
	@Transient
	private Integer foliosPosteados = 0;
	
	@Transient
	private List<TbListasValorDet> previousState;
	
	@Transient
	private Integer bpreviousState;
	
	/*
	 * Estados de Nota por orden
	 */
	public static final Integer RECEPCION = 11;
	public static final Integer VERIFICACION_TECNICO_VT = 10;
	public static final Integer VERIFICACION_RECEPCION_SUPERVISOR_VRS = 9;
	public static final Integer ESTADO_DISTRIBUCION = 1;
	public static final Integer ESTADO_PREPARACION = 0;
	public static final Integer LISTA_DIGITACION = 2;
	public static final Integer DIGITACION = 3;
	public static final Integer SUPERVISION_CUADRE = 4;

	public static final Integer VERIFICACION_DIGITACION_SUPERVISOR_VDS = 6;

	public static final Integer LISTA_CONTROL_CALIDAD = 12;

	public static final Integer CONTROL_DE_CALIDAD = 5;

	/**
	 * Todas las declaraciones de notas en estado ASIGNACION_CONTROL_CALIDAD
	 * seran posteadas si el m_proceso de la declaracion es 60
	 */
	public static final Integer ASIGNACION_CONTROL_CALIDAD = 13;
	/**
	 * Todas las declaraciones de notas en estado CERRADA seran posteadas si el
	 * m_proceso de la declaracion es 60
	 */
	public static final Integer CERRADA = 14;
	/**
	 * Todas las declaraciones de notas en estado CERRADA_CONTROL_CALIDAD seran
	 * posteadas si el m_proceso de la declaracion es 60
	 */
	public static final Integer CERRADA_CONTROL_CALIDAD = 15;

	public static final Integer ENVIADA = 7;
	public static final Integer CONFIRMADO = 15;
	public static final Integer ANULADA = 99;
	
	/**
	 * Estados de no movimiento en notas de abono
	 */
	public static final Integer PENDIENTES_LEVANTAR_ANTERIORES =16;
	public static final Integer PENDIENTES_CERRAR_ANTERIORES =17;
	

	/*
	 * Tipos de nota
	 */

	public static final String TIPO_DET = "D";
	public static final String TIPO_MANUAL = "M";
	public static final String TIPO_INTERNET = "I";
	public static final String TIPO_RENTA = "R";
	public static final String TIPO_PENDIENTE = "P";
	
	
	public EdNotaAbono() {
	}
	public EdNotaAbono(String nnotaAbono) {
		this.nnotaAbono = nnotaAbono;
	}

	public EdNotaAbono(String nnotaAbono, TbMoneda tbMoneda,
			EdPlanilla edPlanilla, String cusuario, Date fhingreso, Long ilote,
			Integer benviado, Integer bcuadreNota, Integer bstatusNota,
			Integer brecibido) {
		this.nnotaAbono = nnotaAbono;
		this.tbMoneda = tbMoneda;
		this.edPlanilla = edPlanilla;
		this.cusuario = cusuario;
		this.fhingreso = fhingreso;
		this.ilote = ilote;
		this.benviado = benviado;
		this.bcuadreNota = bcuadreNota;
		this.bstatusNota = bstatusNota;
		this.brecibido = brecibido;
	}
	
	public EdNotaAbono(String nnotaAbono, TbMoneda tbMoneda,
			TbUnidadRecep tbUnidadRecep, EdPlanilla edPlanilla,
			String cusuario, Double vtotalAbonado, Date frecepCumplim,
			Integer ndgiDocNota, Double vdgiMonNota, Integer ndgiDocDigit,
			Double vdgiMonDig, Date fhactualizacion, Date fhingreso,
			Long ilote, Integer benviado, Integer bcuadreNota,
			Integer bstatusNota, Date fhcierreLote, String cusuarioCierre,
			String cusuarioSuperv, Date fhsupervision, String snotaSuperv,
			Integer brecibido, String cusuarioRecibe, Date fhrecibeCtrlDoc,
			String mtipoNota, String cusuarioEnvia, Date fhenvioCtrlDoc,
			String shostFolder, Double ndocPlaDgii, Double vmonPlaDgii,
			String sobservacion, Set<EdDetalleNota> edDetalleNotas,
			Set<EdDeclaraciones> edDeclaracioneses) {
		this.nnotaAbono = nnotaAbono;
		this.tbMoneda = tbMoneda;
		this.tbUnidadRecep = tbUnidadRecep;
		this.edPlanilla = edPlanilla;
		this.cusuario = cusuario;
		this.vtotalAbonado = vtotalAbonado;
		this.frecepCumplim = frecepCumplim;
		this.ndgiDocNota = ndgiDocNota;
		this.vdgiMonNota = vdgiMonNota;
		this.ndgiDocDigit = ndgiDocDigit;
		this.vdgiMonDig = vdgiMonDig;
		this.fhactualizacion = fhactualizacion;
		this.fhingreso = fhingreso;
		this.ilote = ilote;
		this.benviado = benviado;
		this.bcuadreNota = bcuadreNota;
		this.bstatusNota = bstatusNota;
		this.fhcierreLote = fhcierreLote;
		this.cusuarioCierre = cusuarioCierre;
		this.cusuarioSuperv = cusuarioSuperv;
		this.fhsupervision = fhsupervision;
		this.snotaSuperv = snotaSuperv;
		this.brecibido = brecibido;
		this.cusuarioRecibe = cusuarioRecibe;
		this.fhrecibeCtrlDoc = fhrecibeCtrlDoc;
		this.mformato = mtipoNota;
		this.cusuarioEnvia = cusuarioEnvia;
		this.fhenvioCtrlDoc = fhenvioCtrlDoc;
		this.shostFolder = shostFolder;
		this.ndocPlaDgii = ndocPlaDgii;
		this.vmonPlaDgii = vmonPlaDgii;
		this.sobservacion = sobservacion;
		this.edDetalleNotas = edDetalleNotas;
		this.edDeclaracioneses = edDeclaracioneses;
	}

	
	
	public String getNnotaAbono() {
		return this.nnotaAbono;
	}

	public void setNnotaAbono(String nnotaAbono) {
		this.nnotaAbono = nnotaAbono;
	}

	
	public TbMoneda getTbMoneda() {
		return this.tbMoneda;
	}

	public void setTbMoneda(TbMoneda tbMoneda) {
		this.tbMoneda = tbMoneda;		
	}
	
	public TbUnidadRecep getTbUnidadRecep() {
		return this.tbUnidadRecep;
	}

	public void setTbUnidadRecep(TbUnidadRecep tbUnidadRecep) {
		this.tbUnidadRecep = tbUnidadRecep;
	}

	
	public EdPlanilla getEdPlanilla() {
		return this.edPlanilla;
	}

	public void setEdPlanilla(EdPlanilla edPlanilla) {
		this.edPlanilla = edPlanilla;
	}

	
	public String getCusuario() {
		return this.cusuario;
	}

	public void setCusuario(String cusuario) {
		this.cusuario = cusuario;
	}

	
	public Double getVtotalAbonado() {
		return this.vtotalAbonado;
	}

	public void setVtotalAbonado(Double vtotalAbonado) {
		this.vtotalAbonado = vtotalAbonado;
	}

	
	public Date getFrecepCumplim() {
		return this.frecepCumplim;
	}

	public void setFrecepCumplim(Date frecepCumplim) {
		this.frecepCumplim = frecepCumplim;
	}

	
	public Integer getNdgiDocNota() {
		return this.ndgiDocNota;
	}

	public void setNdgiDocNota(Integer ndgiDocNota) {
		this.ndgiDocNota = ndgiDocNota;
	}

	
	public Double getVdgiMonNota() {
		return this.vdgiMonNota;
	}

	public void setVdgiMonNota(Double vdgiMonNota) {
		this.vdgiMonNota = vdgiMonNota;
	}

	
	public Integer getNdgiDocDigit() {
		return this.ndgiDocDigit;
	}

	public void setNdgiDocDigit(Integer ndgiDocDigit) {
		this.ndgiDocDigit = ndgiDocDigit;
	}

	
	public Double getVdgiMonDig() {
		return this.vdgiMonDig;
	}

	public void setVdgiMonDig(Double vdgiMonDig) {
		this.vdgiMonDig = vdgiMonDig;
	}

	
	public Date getFhactualizacion() {
		return this.fhactualizacion;
	}

	public void setFhactualizacion(Date fhactualizacion) {
		this.fhactualizacion = fhactualizacion;
	}

	
	public Date getFhingreso() {
		return this.fhingreso;
	}

	public void setFhingreso(Date fhingreso) {
		this.fhingreso = fhingreso;
	}

	
	public Long getIlote() {
		return this.ilote;
	}

	public void setIlote(Long ilote) {
		this.ilote = ilote;
	}

	
	public Integer getBenviado() {
		return this.benviado;
	}

	public void setBenviado(Integer benviado) {
		this.benviado = benviado;
	}

	
	public Integer getBcuadreNota() {
		return this.bcuadreNota;
	}

	public void setBcuadreNota(Integer bcuadreNota) {
		this.bcuadreNota = bcuadreNota;
	}

	
	public Integer getBstatusNota() {
		return this.bstatusNota;
	}

	public void setBstatusNota(Integer bstatusNota) {
		this.bstatusNota = bstatusNota;
	}

	
	public Date getFhcierreLote() {
		return this.fhcierreLote;
	}

	public void setFhcierreLote(Date fhcierreLote) {
		this.fhcierreLote = fhcierreLote;
	}

	
	public String getCusuarioCierre() {
		return this.cusuarioCierre;
	}

	public void setCusuarioCierre(String cusuarioCierre) {
		this.cusuarioCierre = cusuarioCierre;
	}

	
	public String getCusuarioSuperv() {
		return this.cusuarioSuperv;
	}

	public void setCusuarioSuperv(String cusuarioSuperv) {
		this.cusuarioSuperv = cusuarioSuperv;
	}

	
	public Date getFhsupervision() {
		return this.fhsupervision;
	}

	public void setFhsupervision(Date fhsupervision) {
		this.fhsupervision = fhsupervision;
	}

	
	public String getSnotaSuperv() {
		return this.snotaSuperv;
	}

	public void setSnotaSuperv(String snotaSuperv) {
		this.snotaSuperv = snotaSuperv;
	}

	
	public Integer getBrecibido() {
		return this.brecibido;
	}

	public void setBrecibido(Integer brecibido) {
		this.brecibido = brecibido;
	}

	
	public String getCusuarioRecibe() {
		return this.cusuarioRecibe;
	}

	public void setCusuarioRecibe(String cusuarioRecibe) {
		this.cusuarioRecibe = cusuarioRecibe;
	}
	
	public Date getFhrecibeCtrlDoc() {
		return this.fhrecibeCtrlDoc;
	}

	public void setFhrecibeCtrlDoc(Date fhrecibeCtrlDoc) {
		this.fhrecibeCtrlDoc = fhrecibeCtrlDoc;
	}

	public String getCusuarioEnvia() {
		return this.cusuarioEnvia;
	}

	public void setCusuarioEnvia(String cusuarioEnvia) {
		this.cusuarioEnvia = cusuarioEnvia;
	}

	
	public Date getFhenvioCtrlDoc() {
		return this.fhenvioCtrlDoc;
	}

	public void setFhenvioCtrlDoc(Date fhenvioCtrlDoc) {
		this.fhenvioCtrlDoc = fhenvioCtrlDoc;
	}

	
	public String getShostFolder() {
		return this.shostFolder;
	}

	public void setShostFolder(String shostFolder) {
		this.shostFolder = shostFolder;
	}

	public Double getVmonPlaDgii() {
		return this.vmonPlaDgii;
	}

	public void setVmonPlaDgii(Double vmonPlaDgii) {
		this.vmonPlaDgii = vmonPlaDgii;
	}
	
	public String getSobservacion() {
		return this.sobservacion;
	}

	public void setSobservacion(String sobservacion) {
		this.sobservacion = sobservacion;
	}
	
	public Set<EdDetalleNota> getEdDetalleNotas() {
		return this.edDetalleNotas;
	}

	public void setEdDetalleNotas(Set<EdDetalleNota> edDetalleNotas) {
		this.edDetalleNotas = edDetalleNotas;
	}
	
	public Set<EdDeclaraciones> getEdDeclaracioneses() {
		return this.edDeclaracioneses;
	}

	public void setEdDeclaracioneses(Set<EdDeclaraciones> edDeclaracioneses) {
		this.edDeclaracioneses = edDeclaracioneses;
	}
		
	public Long getItecnico() {
		return itecnico;
	}
	public void setItecnico(Long itecnico) {
		this.itecnico = itecnico;
	}
	
	@Transient
	public String getNplanilla() {
		return edPlanilla.getNplanilla();
	}
	
	public void setNplanilla(String nplanilla) {
		edPlanilla.setNplanilla(nplanilla);
	}
	
	public String getMformato() {
		return mformato;
	}
	
	public void setMformato(String mformato) {
		this.mformato = mformato;
	}
	
	public Double getNdocPlaDgii() {
		return ndocPlaDgii;
	}
	public void setNdocPlaDgii(Double ndocPlaDgii) {
		this.ndocPlaDgii = ndocPlaDgii;
	}
	public Boolean getCierreDigitacion() {
		return cierreDigitacion;
	}
	public void setCierreDigitacion(Boolean cierreDigitacion) {
		this.cierreDigitacion = cierreDigitacion;
	}
	public boolean isChecked() {
		return checked;
	}
	public void setChecked(boolean checked) {
		this.checked = checked;
	}
	public Boolean getCierreCalidad() {
		return cierreCalidad;
	}
	public void setCierreCalidad(Boolean cierreCalidad) {
		this.cierreCalidad = cierreCalidad;
	}
	public Integer getFoliosEnCalidad() {
		return foliosEnCalidad;
	}
	public void setFoliosEnCalidad(Integer foliosEnCalidad) {
		this.foliosEnCalidad = foliosEnCalidad;
	}
	public List<TbListasValorDet> getPreviousState() {
		return previousState;
	}
	public void setPreviousState(List<TbListasValorDet> previousState) {
		this.previousState = previousState;
	}
	public Integer getFoliosPosteados() {
		return foliosPosteados;
	}
	public void setFoliosPosteados(Integer foliosPosteados) {
		this.foliosPosteados = foliosPosteados;
	}
	public Integer getBpreviousState() {
		return bpreviousState;
	}
	public void setBpreviousState(Integer bpreviousState) {
		this.bpreviousState = bpreviousState;
	}

}
